package ar.com.ctrln.view.dashboard.ventas.factibilidad;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.WrongValueException;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Constraint;
import org.zkoss.zul.Image;
import org.zkoss.zul.Intbox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Tabbox;
import org.zkoss.zul.Tabpanel;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.ventas.factibilidad.RegistrarFactibilidad;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.evento.TemaEvento;
import ar.com.ctrln.persistence.model.factibilidad.DetalleFactibilidad;
import ar.com.ctrln.persistence.model.factibilidad.Factibilidad;
import ar.com.ctrln.persistence.model.factibilidad.FactibilidadCliente;
import ar.com.ctrln.persistence.model.factibilidad.TemaFactibilidad;
import ar.com.ctrln.persistence.model.organizacion.TipoActividad;
import ar.com.ctrln.persistence.model.organizacion.TipoOrganizacion;
import ar.com.ctrln.persistence.model.persona.Direccion;
import ar.com.ctrln.persistence.model.persona.Localidad;
import ar.com.ctrln.persistence.model.persona.Provincia;
import ar.com.ctrln.persistence.model.persona.Telefono;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarFactibilidadController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = -1691295701235450610L;

	@WireVariable
	private RegistrarFactibilidad registrarFactibilidad;

	@Wire
	private Window wRegistrarSolicitudCliente;

	@Wire
	private Tabbox tb;

	@Wire
	private Textbox txtRazonSocial;

	@Wire
	private Combobox cboxTipoActividad;

	@Wire
	private Combobox cboxCondicionIVA;

	@Wire
	private Textbox txtTelefono;

	@Wire
	private Image imgOk;

	@Wire
	private Textbox txtCuit;

	@Wire
	private Textbox txtFax;

	@Wire
	private Textbox txtEmail;

	@Wire
	private Textbox txtWeb;

	@Wire
	private Textbox txtCalle;

	@Wire
	private Intbox txtNumero;

	@Wire
	private Textbox txtDepto;

	@Wire
	private Intbox txtPiso;

	@Wire
	private Textbox txtCpostal;

	@Wire
	private Combobox cboxProvincia;

	@Wire
	private Combobox cboxLocalidad;

	@Wire
	private Tabpanel tabCliente;

	@Wire
	private Tabpanel tabServicio;

	@Wire
	private Listbox lbServicios;

	@Wire
	private Button btAgregar;

	@Wire
	private Button btQuitar;

	@Wire
	private Button btGuardar;

	@Wire
	private Button btnQuitarServicio;

	@Wire
	private Textbox txtObservacion;

	private FactibilidadCliente factibilidad;

	private Localidad localidad;

	private Provincia provincia;

	private Direccion direccion;

	private TipoActividad tipoActividad;

	private TipoOrganizacion tipoOrganizacion;

	private ListModelList<TipoServicio> modelo;

	private Set<TipoServicio> seleccion;

	@SuppressWarnings("rawtypes")
	private EventQueue seleccionarServicios;

	@SuppressWarnings("unchecked")
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		imgOk.setVisible(false);

		txtCuit.setConstraint(validacionCliente);

		cboxProvincia.setModel(new ListModelList<Provincia>(
				registrarFactibilidad.listaProvincias()));

		cboxTipoActividad.setModel(new ListModelList<TipoActividad>(
				registrarFactibilidad.listaTipoActividad()));

		seleccion = new HashSet<TipoServicio>();

		seleccionarServicios = EventQueues.lookup("seleccionarServicios",
				EventQueues.DESKTOP, true);
		seleccionarServicios.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				seleccion = (Set<TipoServicio>) event.getData();
				modelo.clear();
				modelo.addAll(seleccion);
			}
		});
		modelo = new ListModelList<TipoServicio>();

		lbServicios.setModel(modelo);

	}

	private Constraint validacionCliente = new Constraint() {

		@Override
		public void validate(Component comp, Object value)
				throws WrongValueException {
			String cuit = value.toString();
			Cliente resultado = registrarFactibilidad.buscarClienteCuit(cuit);
			if (resultado == null) {
				imgOk.setVisible(true);
			} else {
				imgOk.setVisible(false);
				throw new WrongValueException(comp, "Cliente ya Existe!");
			}
		}
	};

	@Listen("onClick = #btGuardar")
	public void registrarFactibilidad() {

		Set<Telefono> telefonos = new HashSet<Telefono>();

		TemaFactibilidad tema = new TemaFactibilidad();

		factibilidad = new FactibilidadCliente();

		factibilidad.setActiva(true);

		factibilidad.setFechaAlta(new Date());

		factibilidad.setTipoFactibilidad(Factibilidad.TIPO_CLIENTE);

		factibilidad.setCuit_cuil(txtCuit.getText());

		factibilidad.setRazonSocial(txtRazonSocial.getText());

		factibilidad.setTipoIva(cboxCondicionIVA.getSelectedItem().getLabel());

		tipoActividad = (TipoActividad) cboxTipoActividad.getModel()
				.getElementAt(cboxTipoActividad.getSelectedIndex());

		factibilidad.setTipoActividad(tipoActividad);

		tipoOrganizacion = registrarFactibilidad
				.getTipoOrganizacion(TipoOrganizacion.TIPO_CLIENTE);

		factibilidad.setTipoOrganizacion(tipoOrganizacion);

		Telefono telefono = new Telefono();

		Telefono fax = new Telefono();

		telefono.setTipoTelefono(Telefono.TIPO_TELEFONO_ORG);
		telefono.setNumero(txtTelefono.getText());

		fax.setTipoTelefono(Telefono.TIPO_TELEFONO_FAX);
		fax.setNumero(txtFax.getText());

		telefonos.add(telefono);

		telefonos.add(fax);

		factibilidad.setEstado(Factibilidad.ESPERA_MANTENIMIENTO);

		factibilidad.setTelefonos(telefonos);

		direccion = new Direccion();

		direccion.setCalle(txtCalle.getValue());
		if (txtNumero.getValue() == null)
			direccion.setNumero("");
		else
			direccion.setNumero(Integer.toString(txtNumero.getValue()));

		direccion.setCodigoPostal(txtCpostal.getValue());
	
		if (txtDepto.getText() == "") {
			direccion.setDepartamento("");
		} else {
			direccion.setDepartamento(txtDepto.getValue());
		}
	
		if (txtPiso.getValue() == null) {
			direccion.setPiso("0");
		} else {
			direccion.setPiso(Integer.toString(txtPiso.getValue()));
		}

		direccion.setTipoDireccion(Direccion.TIPO_DIRECCION_FISCAL);

		localidad = (Localidad) cboxLocalidad.getModel().getElementAt(
				cboxLocalidad.getSelectedIndex());
		direccion.setLocalidad(localidad);

		factibilidad.setEmail(txtEmail.getText());

		factibilidad.setSitioWeb(txtWeb.getText());

		registrarFactibilidad.guardarTelefono(telefono);
		registrarFactibilidad.guardarTelefono(fax);

		registrarFactibilidad.guardarDireccion(direccion);

		factibilidad.setDireccion(direccion);

		factibilidad.setObservaciones(txtObservacion.getText());

		// insertar factibilidad

		registrarFactibilidad.nuevoFactibilidad(factibilidad);

		tema.setFactibilidad(factibilidad);
		tema.setNombre("Factibilidad Cliente: " + factibilidad.getRazonSocial());
		tema.setObservacion(factibilidad.getObservaciones());
		tema.setEstado(TemaEvento.SIN_AGENDAR);
		tema.setFechaAlta(new Date());
		tema.setResultado("");
		tema.setSeleccionado(false);

		registrarFactibilidad.nuevoTema(tema);

		DetalleFactibilidad detalle;

		for (Listitem item : lbServicios.getItems()) {
			TipoServicio tipoServicio = item.getValue();
			detalle = new DetalleFactibilidad();
			detalle.setFactibilidad(factibilidad);
			detalle.setTipoServicio(tipoServicio);
			// insertar los detalles
			registrarFactibilidad.nuevoDetalleFactibilidad(detalle);
		}

		Clients.showNotification("Registración de Solicitud de Cliente de "
				+ txtRazonSocial.getValue() + " exitosa",
				Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 4000);

		wRegistrarSolicitudCliente.onClose();
	}

	@Listen("onClick = #btAgregar")
	public void agregarServicio() {

		Set<TipoServicio> seleccion = new HashSet<TipoServicio>();
		for (TipoServicio servicio : modelo.getInnerList()) {
			seleccion.add(servicio);
		}

		Executions.getCurrent().getDesktop()
				.setAttribute("seleccion", seleccion);

		Executions.createComponents(
				"/zul/ventas/solicitud/agregarServicios.zul",
				wRegistrarSolicitudCliente, null);

	}

	@Listen("onClick = #btnQuitarServicio")
	public void quitarServicio() {
		if (lbServicios.getSelectedItem() == null) {
			Clients.showNotification("Seleccione un Servicio", lbServicios);

		} else {
			modelo.remove(lbServicios.getSelectedIndex());
		}
	}

	@Listen("onSelect = #cboxProvincia")
	public void seleccionLocalidad() {
		provincia = (Provincia) cboxProvincia.getModel().getElementAt(
				cboxProvincia.getSelectedIndex());
		cboxLocalidad.setModel(new ListModelList<Localidad>(
				registrarFactibilidad.listaLocalidadPorProvincia(provincia
						.getId())));
	}

}
